import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ChamadaFuncao implements Expressao {

	private String nomeFuncao;
	private Integer regFinal;
	private List<AcaoSemantica> parametros = new LinkedList<AcaoSemantica>();

	public ChamadaFuncao(String funcao, List<AcaoSemantica> parametros) {
		this.nomeFuncao = funcao;
		if (parametros != null) this.parametros = parametros;
	}

	@Override
	public String getCode() {
		StringBuffer sb = new StringBuffer();
		
		regFinal = ParserUtils.novoRegistrador();

		List<Integer> regs = new ArrayList<Integer>();
		
		for (AcaoSemantica as1 : parametros) {
			if (as1 instanceof Literal || as1 instanceof Variavel) {
				Integer reg = ParserUtils.novoRegistrador();
				sb.append("LD R" + reg + ", " + as1.getCode());
				sb.append(System.lineSeparator());
				regs.add(reg);
			}
		}
		
		for (Integer integer : regs) {
			sb.append("PUSH R" + integer);
			sb.append(System.lineSeparator());
		}

		sb.append("CALL " + nomeFuncao);
		
		for (int j = regs.size()-1; j >= 0; j--) {
			sb.append(System.lineSeparator());
			sb.append("POP R" + regs.get(j));
		}
		return sb.toString();
	}

	@Override
	public Integer registradorFinal() {
		return regFinal;
	}

	@Override
	public boolean possuiRegistradorFinal() {
		return true;
	}

}
